package com.chenyun.satoken.starter.service.impl;

import cn.dev33.satoken.stp.StpInterface;
import com.alibaba.fastjson2.JSONArray;
import com.chenyun.common.constants.UserConstants;
import com.chenyun.satoken.starter.util.SaUtil;
import com.chenyun.satoken.starter.util.SatokenContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 加载用户权限
 * 多账户解决方案: 在登录后缓存用户信息 ,其中有用户类型字段;在拿权限的时候判断
 * <p>
 * 登录时候已将权限和角色信息写入了 在这里直接拿就可以了
 * @author: Lonni
 * @date: 2022/8/12 0012 11:09
 */
@Component
@Slf4j
public class MyStpInterface implements StpInterface {
    public MyStpInterface() {
        log.info("MyStpInterface被加载......");
    }

    /**
     * 返回一个账号所拥有的权限码集合
     *
     * @param loginId   账号id
     * @param loginType 账号标识 多用户体系下使用
     * @return
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {

        if (SaUtil.isAdmin()) {
            log.info("超级管理员,拥有所有权限" );
            return new ArrayList<String>() {{
                add("*" );
            }};
        }

        Object cacheValue = SatokenContext.instance.getSession().get(UserConstants.USER_PERMISSION_CACHE_KEY);
        if (Objects.isNull(cacheValue)){
            return new ArrayList<>();
        }
        JSONArray array=(JSONArray)cacheValue;
        return array.toList(String.class);

    }


    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     *
     * @param loginId   账号id
     * @param loginType 账号标识 多用户体系下使用
     * @return
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        //这里每次调用工具类的时候都会进入,所以需要做缓存
        if (SaUtil.isAdmin()) {
            log.info("超级管理员,拥有所有权限" );
            return new ArrayList<String>() {{
                add("*" );
            }};
        }
        Object cacheValue =  SatokenContext.instance.getSession() .get(UserConstants.USER_ROLE_CACHE_KEY);
        if (Objects.isNull(cacheValue)){
            return new ArrayList<>();
        }
        JSONArray array=(JSONArray)cacheValue;
        return array.toList(String.class);
    }
}
